<?php 

class Event_CallCenterPricePreSave extends Crud_Event_Handler 
{
	protected $_type = 'preSave';
	
	/**
	 * Run handler with options array.
	 * 
	 * @param OrdersRow $row
	 * @return void
	 */
	public function run($row)
	{
		if ($row instanceof Crud_Section_Row) {
			$row = $row->getRow();
		}
	
		$service = OrderStatusPeer::getInstance();
		$uncall = $service->getStatusByKey('uncall');
		$placed = $service->getStatusByKey(OrdersService::STATUS_ORDER_PLACED);
		$unverified = $service->getStatusByKey(OrdersService::STATUS_ORDER_UNVERIFIED);
		
		if ($this->_getParam('cancel') && !$row->isCanceled()) {
			$row->addLog("%s отменил заказ");
			$this->_cancel($row);
		}else if ($this->_getParam('submit') && ($row->isModifiedAvailable() || $row->getOrderStatusId() == $unverified->getId())) {
			if (!$this->_getParam('operator_id')) {
				throw new Crud_Exception("Вы не выбрали оператора.");
			}
			$status = $service->getStatusByKey(OrdersService::STATUS_ORDER_APPROVED);
			$row->setOrderStatusId($status->getId());
			$row->addLog("%s подтвердил заказ");
			$row->setAcceptedAt(date('Y-m-d H:i:s'));
		} else if ($this->_getParam('change') && $row->isModifiedAvailable()) {
			if (!$row->getOrderStatusId()) {
				$row->setOrderStatusId($placed->getId());
			}
		} else if ($this->_getParam('copy')) {
			// nothing
		} else {
			throw new Crud_Exception('Вы пытаетесь совершить неизвестное действие');
		}
		
		if ($row->getOrderStatusId() == $uncall->getId()) {
			$row->setOrderStatusId($placed->getId());
			$row->addLog("%s изменил заказ. Статус 'Не дозвонились' автоматически сменен на 'Размещен'");
		}
		
		if ($row->getId()) {
			$this->_logChangedColumns($row);
		}

		$type_script = $this->_getParam('type_script', null);
		if($type_script == 'price_product'){
			$this->_editProductPrice($row);
		}
		
		if($type_script == 'percent'){
			//пишем в лог если был выставлен процент
			$percent_form = $this->_getParam('percent');
			$order_percent = $row->getPercent();
			if($percent_form != $order_percent){
			$row->addLog("%s применил процентную скидку на заказ ({$row->getId()}) в размере ".$percent_form." процентов");
			$row->save();
			}
		}
			//пишем в лог если изменили стоимость доставки и копируем цену доставки в поле по умолчанию
			$delivery_sum = $this->_getParam('delivery_sum');
			$base_deliv = $row->getDeliveryCost();
			$default_delivery_cost = $row->getCleanDeliveryCost();
			if($delivery_sum != $base_deliv){
				$row->addLog("%s изменил стоимость доставки в заказе ({$row->getId()})");
				if($default_delivery_cost == 0){
					$row->setCleanDeliveryCost($base_deliv);
				}
				$row->save();
			}
	}

	protected function _editProductPrice($row)
	{
		$user = $this->_getAdminUser();

		$order_id = (int)$this->_getParam('id'); 				//id заказа
		$order = OrdersPeer::getInstance();
		$price_order = Order2productPeer::getInstance();
		$select = Order2productPeer::getInstance()->select();
		$select->where('`order_id` = ?', $order_id);
		$order_price = $price_order->fetchAll($select); 		 // получаем все продукты по заказу

		$pp = array();
		foreach($order_price as $ord){
			$price_ord = $ord['price'];
			$pp[] = $price_ord;
		}

		$i = 0;
		$b = 0;
		$itog_summ = 0;
		while(true){
			$no_percent = $this->_getParam('no_percent_'.$i, null);
			$no_percent_count = $this->_getParam('no_percent_count_'.$i, null);
			$clean_price = $this->_getParam('clean_price_'.$i, null);
			$row2 = $this->_getParam('price_id_'.$i, null);
			if(!isset($no_percent)){
				break;
			}
			$price_p = $pp[$i];


			//если запись из базы, не равна записи пришедшей из формы, то обновляем запись в таблице
			if($price_p != $no_percent){
				$b++;
				$data = array(
						'price'=> $no_percent
					);
				$price_order->update($data, 'product_id ='.$row2.' AND order_id='.$order_id);
			}

			$itog_summ = $itog_summ + ($no_percent * $no_percent_count);
			$i++;
		}

		if($b > 0){
			$price = $this->_getParam('total');
			$total_price = $this->_getParam('total_price');

			if($price == $total_price){
				$data_order = array(
								'total_price' => $price,
								'total_cost'=> $itog_summ,
								'percent' => null,
								'type_discount'=> 2,
								'time_update_price' => date('Y.m.d H:i:s'),
								'edit_name' => $user->getId(),
						);
			}else{

				$data_order = array(
								'total_cost'=> $itog_summ,
								'percent' => null,
								'type_discount'=> 2,
								'time_update_price' => date('Y.m.d H:i:s'),
								'edit_name' => $user->getId(),
						);
			}
					$order->update($data_order, 'id ='.$order_id);

					$row->addLog("%s изменил цену продуктов в заказе ({$row->getId()})");
					$row->save();
				}
	}
	
	/**
	 * Логгирует какие поля в orders были изменены.
	 * 
	 * @param OrdersRow $row
	 * @return void
	 */
	protected function _logChangedColumns($row)
	{
		$columns = array(
			'delivery_comment' => 'комментарий к заказу', 
			'operator_id' => 'оператор', 
			'executed_at' => 'дата доставки', 
			'delivery_time_id' => 'интервал доставки',
		);

		$changed = array();
		$filter = new Zend_Filter_Word_UnderscoreToCamelCase();
		foreach($columns as $param => $name) {
			$currentValue = $this->_getParam($param);
			$getter = 'get' . ucfirst($filter->filter($param));
			$rowValue = $row->$getter();
			if ($param == 'executed_at') {
				$currentValue = date('Y-m-d', strtotime($currentValue));
			}
			if ($row->$getter() != $currentValue) {
				$changed[] = $name;
			}
		}
		
		if ($changed) {
			$changed = implode(', ', $changed);
			$row->addLog('%s изменил поля ' . $changed);
		}
	}
	
}